package main

import (
	"fmt"
	"sync"
	"time"
)

// 协程······
// 进程 和 现成。。。。  自行理解吧。。。
// 并发和并行 ==>
// 并发： 多线程竞争一个执行
// 并行： 多线程同时执行

// 协程： 在主线程 开启多个 子线程 称作协程

// 在主线程中也每隔一秒输出”你好golang”，输出10次后，退出程序要求主线程和goroutine同时执行
// 全局定义协程
var wg sync.WaitGroup

func test() {
	for i := 0; i < 10; i++ {
		fmt.Println("test () 你好golang\t", i)
		time.Sleep(time.Millisecond * 50)
	}
	// 标志协程结束
	wg.Done()
}

func main() {
	// go test() // go 方法() 即可开启一个协程
	// // 缺陷： 主进程方法较快的执行完会导致子进程被强制退出， 为打印完全
	// for i := 0; i < 10; i++ {
	// 	fmt.Println("main() 你好golang")
	// 	time.Sleep(time.Millisecond * 10)
	// }

	// 引入 waitGroup
	wg.Add(1) // 标记加入一个协程
	go test() // go 方法() 即可开启一个协程
	for i := 0; i < 10; i++ {
		fmt.Println("main() 你好golang\t", i)
		time.Sleep(time.Millisecond * 10)
	}
	wg.Wait() // 等待所有协程执行完毕
}
